package untiring07_HelloJDBC;

import java.util.ArrayList;
import java.util.List;

public class J04_Collection {

	// 콜렉션 collection
	// 객체지향 기반 프로그램 작성시 종종 같은 종류의 객체의 묶음
	// group이나 다른 종류의 객체 묶음을 함꼐 쓰는 때가 있음

	// 앞서 배운 배열은 같은 종류의 객체 묶음이지만 유연성이 부족하고, 크기
	// 조정도 안되고 다른 종류의 객체도 가질수 없음

	// 다행히 자바에는 이러한 종류의 객체를 쉽게 다룰 수 있는 인터페이스와 클래스를 제공
	// 그것은 바로 Collection 프레임워크임
	// 대부분 java.util 패키지에 포진해 있음

	// collection 은 다른 종류로 구성된 객체들의 묶음을 의미
	// 또 다른 말로 용기 container 라고도 하는데, 각 요소를 저장, 검색, 조작하는 메서드를 제공

	// Collection <-Set,List, Queue
	// List <-ArrayList,Vector
	// Map <- AbstractMap ,SortedMap
	// AbstactMap <- HashMap
	// Iterator,Comparator

	// 이들 대부분은 java.util 패키지에 포함됨

	// List - 동적배열
	// Collection 의 가장 인기있는 하위 인터페이스임
	// ArrayList는 List의 가장 자주사용하는 구현 클래스
	// List는 자료를 순서대로 저장하는 특성을 가짐
	// FIFO : first in first out 선입선출
	// 또한 , 데이터를 중복으로 저장가능
	// 단Set은 중복 허용 불가!
	// add메서드를 통해 데이터를 List의 맨끝에 추가
	
	// 지네릭 genric
	// collection 을 배울때  generic을 빼놓으면 불완전하게 collection을 배우는 것임
	// collection을 사용할때 발생할 수 있는
	// 컴파일 시간때 엄격한 자료형을 검사를 지원 또한, 
	// collection 을 다룰때 대부분의 downcasting을 제거하고 사용할 수 있음
	// 또한 , C++에서 제공하는 클래스 템플릿을 작성할 수 있게 해줌(고급)
	
	// 지네릭에서는 매개변수 자료형 parameterized type을 이용해서
	// collection요소의 자료형을 지정함
	// 메서드의 매개변수는 ()안에 사용하는 것처럼collection에서는 <>안에 매개변수자료형을 사용
	// List<String> result = null;
	

	public static void main(String[] args) {
		List a = new ArrayList();
		a.add(1111);
		a.add('수');
		a.add(123.456);
		a.add("김태희");
		a.add(new J03_MemberVO());
		System.out.println(a);

		// ArrayList 에 저장된 객체를 하나씩 꺼내 출력
		// 변수에 따로 저장
		// 이유 : ArrayList 에 객체를 저장할때는 대상이 무엇이든간에 무조건 Object형으로 저장됨
		// 따라서, ArrayList 에 저장된 객체를 꺼낼때는 객체의 자료형에 맞춰 downcasting이 필요(JDK5이전)
		
		int num1 = (int)a.get(0);
		
		char cha = (char)a.get(1);
		float floatnum = (float)a.get(2);
		String str = (String)a.get(3);
		
		// 하지만 , 이렇게 해도 일단 오류는 x
		// 실행하면 비로소 오류가 뜸
		// 이런 종류의 오류는 찾기 힘듦
		char num2 = (char)a.get(0);			//int
		Integer intg = (Integer)a.get(3);	//String
		
		//지네릭을 사용했을 경우
		List<String> abc = new ArrayList<String>();
		
		//List<String> abc = new ArrayList<>(); JDK1.7
		//abc 라는  콜렉션(동적배열)에는 String 형식의 값만 추가 할 수 있다는 의미
		//abc.add(123); 자료형 검사후 오류표시
		//abc.add('a');
		abc.add("김태희"); // 정상처리
		
		String xyz = abc.get(0); // 형변환은 필요 x
		List<J03_MemberVO>results = new ArrayList<J03_MemberVO>();
		
		
		System.out.println(a.get(0));
		System.out.println(a.get(1));
		System.out.println(a.get(2));
		System.out.println(a.get(3));
		System.out.println(a.get(4));
	}

}
